#include <sys_head.h>
#include "arg.h"
#include "pthread.h"

// argv[1] IP地址
// argv[2] 端口

// 读写线程
// void *r_pthread(void *arg_fd);
// void *w_pthread(void *arg_fd);

void Client(int Sock_fd);

int main(int argc, char const *argv[])
{
    // 判断命令行参数
    if (argc < 2)
    {
        printf("参数错误:%s ip port\n", argv[0]);
        return -1;
    }

    // 给定默认ip

    char ip_str[128];

    if (3 != argc)
    {

        strcpy(ip_str, "192.168.91.182");//127.0.0.1
    }
    else
    {

        strcpy(ip_str, argv[2]);
    }

    // 1、创建套接字
    int Sock_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (-1 == Sock_fd)
    {
        ERRLOG("socket err");
        return -1;
    }
    // ​2、填充服务器网络信息结构体
    struct sockaddr_in Sock_addr;
    Sock_addr.sin_family = AF_INET;                // 选择IPV4
    Sock_addr.sin_port = htons(atoi(argv[1]));     // 给定端口 atoi 将字符串转化为数字
    Sock_addr.sin_addr.s_addr = inet_addr(ip_str); // IP地址

    socklen_t Sock_size = sizeof(Sock_addr);
    // 3、与服务器建立连接 connect
    if (-1 == connect(Sock_fd, (struct sockaddr *)&Sock_addr, Sock_size))
    {
        ERRLOG("connect err");
        return -1;
    }
    // 4、接收数据
    Client(Sock_fd);

    // 4、关闭套接字 close
    close(Sock_fd);
    return 0;
}

void Client(int Sock_fd)
{
    agr info; // 协议
    char buf[1024];
    // 清理字符串和协议信息
    memset(buf, 0, sizeof(buf));
    memset(info.buf, 0, sizeof(info.buf));
    // 发送请求
    info.request.bytes = 1;
    send(Sock_fd, info.buf, sizeof(info.buf), 0);
    // 接收文件列表
    memset(info.buf, 0, sizeof(info.buf));
    recv(Sock_fd, info.buf, sizeof(info.buf), 0);
    if (2 != info.File_list.bytes)
    {
        puts("no file");
        return;
    }
    // 打印文件列表
    printf("文件列表：\n");
    char *token = strtok(info.File_list.data, ",");
    while (token != NULL)
    {
        printf("%s\n", token);
        token = strtok(NULL, ",");
    }
    // 发送文件名
    memset(info.buf, 0, sizeof(info.buf));

    printf("请输入要下载的文件名：\n");
    fgets(buf, sizeof(buf), stdin);
    strcpy(info.File_name.data, buf);

    info.File_name.bytes = 3; // 设置操作码为3
    send(Sock_fd, info.buf, sizeof(info.buf), 0);

    printf("发送的文件名请求：%s\n", info.File_name.data);
    // 接收文件
    memset(info.buf, 0, sizeof(info.buf));
    FILE *file = fopen("downloaded_file.txt", "wb");
    if (!file)
    {
        perror("fopen");
        printf("尝试打开的文件路径：1.txt\n");
        close(Sock_fd);
        return;
    }

    while (1)
    {
        memset(info.buf, 0, sizeof(info.buf));
        recv(Sock_fd, info.buf, sizeof(info.buf), 0);
        if (info.File_data.bytes != 4)
        {
            break;
        }
        fwrite(info.File_data.data, 1, strlen(info.File_data.data), file);
    }

    fclose(file);
    close(Sock_fd);
}
